package main

import "fmt"

//引出接口的实例

//定义一个能叫的类型
type speaker interface {
	speak() //只要实现了speak方法的变量都是speaker类型
}

type person struct{}

type cat struct{}

type dog struct{}

func (c person) speak() {
	fmt.Println("啊啊啊")
}

func (c cat) speak() {
	fmt.Println("喵喵喵")
}

func (c dog) speak() {
	fmt.Println("汪汪汪")
}

//接口是一种类型，是一种特殊的类型，它规定了变量有哪些方法
//在go语言中会遇到以下场景
//1.我不关心一个变量是什么类型，我只关心能调用它的什么方法

func da(x speaker) {
	//接收一个参数，传进什么，就打印什么
	x.speak()
}

func main() {
	var c1 cat
	var d1 dog
	var p1 person
	da(c1)
	da(d1)
	da(p1)

	var ss speaker //定义一个接口类型：speaker 的变量ss
	ss = c1

	fmt.Println(ss)

}
